package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;

import connection.ConnectionManager;

import modelo.Funcionario;
import modelo.Localizacao;

public class LocalizacaoDAOImp implements LocalizacaoDAO {
	/**
	 * id_localizacao, rua, numero, bairro, cep, cidade, estado
	 */
	private final String INSERT = "INSERT INTO Localizacao(rua, numero, bairro, cep, cidade, estado) VALUES (?,?,?,?,?,?)";
	private final String UPDATE = "UPDATE Localizacao SET id_localizacao = ? , rua = ?, numero = ?, bairro = ?, cep = ?, cidade = ?, estado = ? WHERE id_localizacao = ?";
	private final String DELETE = "DELETE from Localizacao WHERE id_localizacao = ?";
	private final String ALL = "SELECT * FROM Localizacao";
	private final String ID = "SELECT * FROM Localizacao WHERE id_localizacao = ?";
	private final String LIKERua = "SELECT * FROM Localizacao where rua like ?";
	private final String LIKEEstado = "SELECT * FROM Localizacao where estado like ?";
	private final String LIKECidade = "SELECT * FROM Localizacao where cidade like ?";
	private final String LIKECep = "SELECT * FROM Localizacao where cep like ?";

	private ConnectionManager connectionManager;
	private static Connection connection;

	LocalizacaoDAOImp() {
		this.openConnection();
	}

	@Override
	public boolean isConnectionClose() {
		try {
			return connection.isClosed();
		} catch (SQLException ex) {
			return false;
		}
	}

	@Override
	public Localizacao salvar(Localizacao e) {
		PreparedStatement ps = null;
		try {
			// 1 crie uma instancia de PreparedStatement
			// passe para ela a instrucao para realizar alteracoes em uma
			// registro do banco
			ps = connection.prepareStatement(INSERT);
			/**
			 * rua, numero, bairro, cep, cidade, estado
			 */
			ps.setObject(1, e.getRua());
			ps.setObject(2, e.getNumero());
			ps.setObject(3, e.getBairro());
			ps.setObject(4, e.getCep());
			ps.setObject(5, e.getCidade());
			ps.setObject(6, e.getEstado());

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(LocalizacaoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return e;
	}

	@Override
	public void alterar(Localizacao e) {
		PreparedStatement ps = null;
		
		try {
			// 2 crie uma instancia de PreparedStatement
			// passe para ela a instrucao para realizar alteracoes em uma
			// registro do banco
			ps = connection.prepareStatement(UPDATE);
			/**
			 * id_localizacao, rua, numero, bairro, cep, cidade, estado
			 */
			ps.setObject(1, e.getIdLocalizacao());
			ps.setObject(2, e.getRua());
			ps.setObject(3, e.getNumero());
			ps.setObject(4, e.getBairro());
			ps.setObject(5, e.getCep());
			ps.setObject(6, e.getCidade());
			ps.setObject(7, e.getEstado());
			ps.setObject(8, e.getIdLocalizacao());
			

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(LocalizacaoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}

	}

	@Override
	public void deletar(Localizacao e) {

		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(DELETE);
			// 3 passe para o PreparedStatement o valor do id que deve ser
			// excluido do banco de dados
			ps.setObject(1, e.getIdLocalizacao());

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(LocalizacaoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}

	}

	@Override
	public List<Localizacao> findAll() {

		List<Localizacao> locais = new ArrayList<Localizacao>();

		try {
			PreparedStatement ps = null;
			ResultSet rs = null;
			ps = connection.prepareStatement(ALL);

			// 4 Obtenha uma instancia de resultset
			rs = ps.executeQuery();
			/**
			 * id_localizacao, rua, numero, bairro, cep, cidade, estado
			 */
			while (rs.next()) {
				Localizacao localizacao = new Localizacao();
				localizacao.setIdLocalizacao(rs.getInt("id_localizacao"));
				localizacao.setRua(rs.getString("rua"));
				localizacao.setNumero(rs.getString("numero"));
				localizacao.setBairro(rs.getString("bairro"));
				localizacao.setCep(rs.getString("cep"));
				localizacao.setCidade(rs.getNString("cidade"));
				localizacao.setEstado(rs.getString("estado"));

				locais.add(localizacao);
				// 5 crie uma instancia de cidade com os dados
				// obtidos do banco e adicione a lista de cidadesf

			}

		} catch (SQLException ex) {
			Logger.getLogger(LocalizacaoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return locais;
	}

	@Override
	public void openConnection() {
		if (connectionManager == null) {
			connectionManager = ConnectionManager.getInstance();
		}

		if (connection == null) {
			connection = connectionManager.getConnection();
		}

		if (isConnectionClose()) {
			connection = connectionManager.getConnection();
		}

	}

	@Override
	public void closeConnection() {
		if (connection != null && connectionManager != null) {
			if (!this.isConnectionClose()) {
				connectionManager.closeConnection(connection);
			}
		}
	}

	public List<Localizacao> buscaLocalizacaoPorId(int id_localizacao) {
		List<Localizacao> locais = new ArrayList<Localizacao>();

		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			ps = connection.prepareStatement(ID);
			// 6 informe o parmetro para instrucao like
			ps.setObject(1, id_localizacao);

			rs = ps.executeQuery();
			/**
			 * id_localizacao, rua, numero, bairro, cep, cidade, estado
			 */
			while (rs.next()) {
				locais.add(new Localizacao(
						rs.getInt("id_localizacao"),
						rs.getString("rua"), 
						rs.getString("numero"),
						rs.getString("bairro"),
						rs.getString("cep"),
						rs.getString("cidade"),
						rs.getString("estado")));
			}
		} catch (SQLException ex) {
			Logger.getLogger(LocalizacaoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		
		return locais;
	}

	

	@Override
	public List<Localizacao> buscaLocalizacaoPorEstado(Localizacao localizacao) {
		List<Localizacao> locais = new ArrayList<Localizacao>();

		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			ps = connection.prepareStatement(LIKEEstado);
			// 6 informe o parmetro para instrucao like
			ps.setObject(1, localizacao.getEstado());

			rs = ps.executeQuery();
			/**
			 * id_localizacao, rua, numero, bairro, cep, cidade, estado
			 */
			while (rs.next()) {
				locais.add(new Localizacao(rs.getInt("id_localizacao"),
						rs.getString("rua"), 
						rs.getString("numero"), 
						rs.getString("bairro"),
						rs.getString("cep"),
						rs.getString("cidade"), 
						rs.getString("estado")));
			}
		} catch (SQLException ex) {
			Logger.getLogger(LocalizacaoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return locais;
	}

	

}
